/* 
两个栈s1,s2都采用顺序存储，并共享一个存储区[0, ..., maxsize-1]。
采用栈顶相向，迎面增长的存储方式，设计 s1,s2入栈和出栈的操作。
*/
#include <iostream>
#include "two_stack.h"
using namespace std;

// 共享栈初始化
void Init(two_stack &s) 
{
  s.top[0] = -1; // 0号栈的栈顶
  s.top[1] = maxsize; // 1号栈顶栈顶
}

// 添加元素，i为栈的序号
bool push(two_stack &s, int i, int x)
{
  // 栈的序号不符合要求，添加失败
  if (i < 0 || i > 1)
    return false;
  
  // 栈满，添加失败
  if (s.top[1] - s.top[0] == 1)
    return false;
  
  // 将元素添加进对应的栈
  switch (i)
  {
    // 添加进0号栈
    case 0: 
      s.data[++s.top[0]] = x;
      break;
    
    // 添加进1号栈
    case 1:
      s.data[--s.top[1]] = x;
      break;
  }
  
  // 添加成功
  return true;
}

// 删除元素，i为栈的序号
int pop(two_stack &s, int i)
{
  // 栈的序号不符合要求，删除失败
  if (i < 0 || i > 1)
    return -1;
  
  // 将对应栈的元素删除
  switch (i)
  {
    // 0号栈元素出栈
    case 0:
      
      // 栈空，删除失败
      if (s.top[0] == -1)
        return -1;
      
      // 否则，删除成功
      else
        return s.data[s.top[0]--];
      break;
    
    // 1号栈元素出栈
    case 1:
      
      // 栈空，删除失败
      if (s.top[1] == maxsize)
        return -1;
      
      // 否则，删除成功
      else
        return s.data[s.top[1]++];
      break;
  }
  return 0;
}

int main()
{
  // 创建共享栈
  two_stack s;
  
  // 初始化
  Init(s);
  
  // 添加元素
  push(s, 0, 15);
  push(s, 0, 13);
  push(s, 1, 10);
  
  // 删除元素
  pop(s, 0);
  
  // 查看元素
  cout << s.data[s.top[0]];
  return 0;
}